#include "pointer.h"
#include "mytools.h"
#include <stddef.h>
#include <stdio.h>

int f() { return 0; } // 定义函数f

// * 属性说明符序列(可选) 限定符序列(可选) 声明符
void pointer_declaration() {
  print_title("pointer declaration");
  {
    float *p, **pp;
    int (*fp)(int);
  }

  {
    int n;
    const int *pc = &n; // pc是一个指向整型常量的指针
    // *pc = 2; // error: assignment of read-only variable 'pc'
    pc = NULL; // ok, 可以改地址， 不可以改指针所指的对象的值

    int *const cp = &n; // cp是一个指向整型常量的指针
    *cp = 2; // ok, 可以改变cp所指的对象的值，因为cp是一个常量指针
    // cp = NULL; // error: assignment of read-only variable 'cp'

    int *const *pcp = &cp;
  }

  {
    // 数组指针
    int a[2];
    int *p = a; // 指向a[0]

    int b[3][3];
    int(*row)[3] = b; // 指向b[0]
  }

  {
    // 函数指针
    int (*p)() = f;
    (*p)();
    p();
  }
}